【レポート】AWS環境の最適化テクニックが学べる「Must-know techniques to optimize your AWS environment 」に参加しました #AWSreInvent #NTA405
こんにちは!AWS事業本部のおつまみです。
今回はre:Invent2024のセッション 「Must-know techniques to optimize your AWS environment」 に参加してきたので、内容をご紹介します!
別日に同じセッションを受けたメンバがいたので、こちらもぜひお読みください!
セッションの概要
タイトル
Must-know techniques to optimize your AWS environment
概要
This workshop equips you (particularly if you are new to AWS) with essential tools and techniques that can be used to optimize your environments, even before changing a single line of code in your applications. Using hands-on exercises, learn to leverage AWS Cloud Financial Management tools, AWS Security Hub, and additional resources to identify cost savings, improve performance and resilience, and strengthen your security posture. Leave equipped to take full control of your AWS environment and unlock its full potential. You must bring your laptop to participate.
このワークショップでは、アプリケーションのコードを1行も変更する前であっても、環境を最適化するために使用できる重要なツールとテクニックを身につけることができます。 AWSクラウド財務管理ツール、AWS Security Hub、その他のリソースを活用し、コスト削減、パフォーマンスと回復力の向上、セキュリティの強化について実習を交えて学びます。 AWS環境を完全にコントロールし、その潜在能力を最大限に引き出すためのスキルを身につけましょう。 ノートPCをご持参ください。
スピーカー
- Edward Schaefer, Solutions Architect, Amazon Web Services
- Venkata Moparthi, Sr Solutions Architect, Amazon Web Services
レベル
400
セッションの内容
ワークショップに入る前にAWS環境を最適化するための3つの重要な技術「セキュリティ」「レジリエンス」「コスト最適化」について説明されました。
セキュリティ
セキュリティの重要性について、被害があった時のコストインパクトとはとても大きいです。
そこで、AWSが提供するさまざまなセキュリティサービスの活用が重要。特に、オープンソースツールのProwlerを使って、環境の設定状況を業界のベストプラクティスと比較し、セキュリティの課題を特定することができます。
レジリエンス
クラウド上のアプリケーションは障害に備えて設計する必要があります。可用性目標やデータ保護要件を明確にし、マルチAZや災害対策を組み込むことが重要です。また、モニタリングとオブザーバビリティを設定し、継続的に改善していくことも重要となります。
コスト最適化
クラウド財務管理(CFM)の説明から始まりました。
可視化→削減→計画をし、それを継続的に実行していくことが重要です。
また、これらの取り組みにより、平均して50-60%のコスト削減が可能となり、削減したコストはビジネス成長のための投資に回すことができます。
ここまでが前提の内容でした。
ワークショップ概要
アプリケーションのコード行を変更せずに AWS 環境を最適化する方法を学ぶ内容となっています。すでに標準的な 3 層構造のWeb アプリケーションがデプロイされている環境でした。
この状態から「セキュリティ」「レジリエンス」「コスト最適化」のベストプラクティスに沿ったAWS 環境を最適化していきます。
Workshopは以下のセクションに分かれていました。
- セキュリティの最適化
- セキュリティ評価を展開する
- Prowler ダッシュボードの EC2 にアクセスする
- Prowler ダッシュボードでセキュリティ評価の結果を確認する
- セキュリティ評価の発見事項を修正する
- セキュリティハブでセキュリティ評価の結果を確認する
- 回復力の最適化
- 作業負荷評価
- 推奨事項を確認して展開する
- 作業負荷を再評価する
- コスト最適化
- クラウド財務管理(CFM)ツールを有効にする
- コストと使用状況の監視
- コストと使用状況の分析
- コストと使用状況の可視化
時間の都合上、今回は興味のある「セキュリティの最適化」と「コスト最適化」を実施しました。
セキュリティ最適化
Prowlerを利用し、ラボ環境でセキュリティ評価を実施し、修正すべき領域を特定するといった内容でした。Prowlerは、AWSセキュリティのベストプラクティスを考慮したオープンソースツールです。今回初めて触りました。
Prowler評価を実行する
用意されていたCloudFormationテンプレートを実行し、Prowlerを環境に展開しました。
展開後はこれらのリソースが作成されました。
展開と同時に、セキュリティ評価のためのCodeBuildプロジェクトが実行されます。
約7分ほど評価が完了しました。
対象のS3バケットをクリックすると、Prowlerでセキュリティ評価されたさまざまなファイル形式の出力が確認できました。またHTML 出力にあるファイルをダウンロードすると、わかりやすい形式で結果が確認できました。
HTML形式
フィルター機能もあり、Servityやサービス名でフィルターもできました。
Prowlerダッシュボードで評価結果を確認する
既にprowlerコマンドがインストールされているEC2に対して、以下の操作を実行し、Prowlerダッシュボードを起動させました。
- Prowlerでセキュリティ評価されたS3ファイルをダウンロード
prowler dashboard
コマンドの実行、URLへのアクセス
このダッシュボードも様々な観点でフィルターができるようです。
Security Hubスコアのように検出結果もわかりやすいですね。
個々のチェックを展開すると、特定のリソース、リスクの説明、推奨事項、さらに読むための URL などの具体的な情報が確認できます。
またProwler は、特定の AWS リソースに対するセキュリティ チェックを提供するだけでなく、多くのコンプライアンス標準に対する状況も評価できるようでした。
左の「Compliance」を選択し、フィルターででコンプライアンス標準を選択します。AFSBやCIS、NIST、PCIなど様々なコンプライアンス標準がありました。
「PCI_3.2.1 - AWS」を選択すると、PCI コンプライアンス標準を満たしていないリソースを確認できるようになりました。
たとえば、EC2の項目ではVPC FlowLogsが無効になっていることが検出されていました。
セキュリティ上の発見事項を修正する
ここでは、検出されたセキュリティ事項に対して以下を修正しました。
- S3バケットのパブリックアクセス設定を有効化
- EBSのデフォルト暗号化を有効化
実施方法は一般的だったため、割愛します。
Security Hubで調査結果を確認する
さいごにSecurity HubとProwlerを統合させました。
またProwler の検出結果を Security Hub に送信するために、セキュリティ評価の実行中に Prowler に渡されるパラメータを調整する必要がありました。Cloud Formationのパラメータを調整・再デプロイし、CodeBuildを再実行させます。
実行完了後、Security Hub から Prowler の検出結果を確認できるようになりました。Finding IDの頭文字がprowler-
となっています。
これでセキュリティの分野は完了となりました。
実施した感想
今回初めてProwlerを使用しましたが、マルチクラウド環境のセキュリティ状況を確認できる点が非常に良いと感じました。しかし、セキュリティ評価はCodeBuildで手動で実行する必要があったため、Security Hubの自動実行の方が効率的だと思いました。そのため、AWS環境に特化する場合はSecurity Hubを使用するべきですが、他のマルチクラウド環境全体を確認する場合は、ProwlerとSecurity Hubを目的に応じて組み合わせて使用する必要があると感じました。
コスト最適化
クラウド財務管理(CFM)ツールを有効にする
まずはCost Explorerの[データエクスポート]からCUR2.0のレポートがS3に出力できるように設定しました。
コストと使用状況の監視
次にコスト監視のためにAWS Budget と Cost Anomaly Detectionの有効化を実施しました。
AWS Budget で 2 つのアラートしきい値を作成したのが印象的でした。
- 実際の費用50.00%が予算額を超える場合
- 予測コスト65.00%が予算額を超える場合
どうしてこのような設定を行うのか疑問に思い、講師の方に確認したところ以下の意図があるとのことでした。
- 実際の費用が50.00%予算額を超える場合
- 予算の内部で予期せぬ支出が発生していることを示し、財務的な緊急性を示す。
- 即時的な調査と緊急対応が重要となる
- 予測コストが65.00%予算額を超える場合
- 将来の支出が予算を大幅に超える可能性があることを示し、財務的な計画の見直しや調整が必要であることを示します。
- 将来の支出の評価と計画の見直しが重要です。
各々のアラートに応じて、取るべき行動が変わるとのことで勉強になりました。
コストと使用状況の分析
AWS Glue と Amazon Athena を使用してコストと使用状況のデータを処理し、分析を行いました。いくつかサンプルのクエリが紹介されていました。
項目別コスト上位 10 件説明
SELECT
line_item_product_code,
line_item_line_item_description,
round(sum(line_item_unblended_cost),2) as cost
FROM
customer_all
WHERE
year = '2024' and (month between '1' and '6')
GROUP BY
line_item_product_code,
line_item_line_item_description
ORDER BY
cost DESC
LIMIT 10;
製品別コストトップ10
SELECT
line_item_product_code,
round(sum(line_item_unblended_cost),2) as cost
FROM
customer_all
WHERE
year = '2024' and (month between '1' and '6')
GROUP BY
line_item_product_code
ORDER BY
cost DESC
LIMIT 10;
データ転送
SELECT
bill_payer_account_id,
line_item_usage_account_id,
DATE_FORMAT((line_item_usage_start_date),'%Y-%m-%d') AS day_line_item_usage_start_date,
line_item_resource_id,
line_item_operation,
CASE
--S3 Early Delete
WHEN line_item_usage_type LIKE '%EarlyDelete-ByteHrs' THEN 'Early Delete Glacier'
WHEN line_item_usage_type LIKE '%EarlyDelete%' THEN 'Early Delete ' || SPLIT_PART(line_item_usage_type,'EarlyDelete-',2)
--S3 Requests
WHEN line_item_usage_type LIKE '%Requests-INT%' THEN 'Requests INT'
WHEN (line_item_usage_type LIKE '%Requests-Tier1' OR line_item_usage_type LIKE '%Requests-Tier2') THEN 'Requests Standard'
WHEN (line_item_usage_type LIKE '%Requests-GLACIER%' OR line_item_usage_type LIKE '%Requests-Tier3' OR line_item_usage_type LIKE '%Requests-Tier5' OR line_item_usage_type LIKE '%Requests-Tier6') THEN 'Requests Glacier'
WHEN line_item_usage_type LIKE '%Requests-GDA%' THEN 'Requests GDA'
WHEN line_item_usage_type LIKE '%Requests-GIR%' THEN 'Requests GIR'
WHEN (line_item_usage_type LIKE '%Requests-Tier4' OR line_item_usage_type LIKE '%Requests-SIA%') THEN 'Requests SIA'
WHEN line_item_usage_type LIKE '%Requests-ZIA%' THEN 'Requests ZIA'
--S3 Retrieval
WHEN (line_item_usage_type LIKE '%Retrieval-Bytes' AND line_item_operation = 'RestoreObject') THEN 'Retrieval Glacier'
WHEN (line_item_usage_type LIKE '%Retrieval-Bytes' AND line_item_operation = 'DeepArchiveRestoreObject') THEN 'Retrieval GDA'
WHEN line_item_usage_type LIKE '%Retrieval%' THEN 'Retrieval ' || SPLIT_PART(line_item_usage_type,'Retrieval-',2)
--S3 Storage
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'StandardStorage') THEN 'Storage Standard'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'StandardIAStorage') THEN 'Storage SIA'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'StandardIASizeOverhead') THEN 'Storage SIA-Overhead'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'OneZoneIAStorage') THEN 'Storage ZIA'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'OneZoneIASizeOverhead') THEN 'Storage ZIA-Overhead'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'GlacierInstantRetrievalStorage') THEN 'Storage GIR'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'GlacierIRSizeOverhead') THEN 'Storage GIR-Overhead'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'GlacierStorage') THEN 'Storage Glacier'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'GlacierStagingStorage') THEN 'Storage Glacier-Staging'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND (line_item_operation = 'GlacierObjectOverhead' or line_item_operation = 'GlacierS3ObjectOverhead')) THEN 'Storage Glacier-Overhead'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'RestoreObject') THEN 'Storage Glacier-Restored'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'DeepArchiveStorage') THEN 'Storage GDA'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'DeepArchiveStagingStorage') THEN 'Storage GDA-Staging'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND (line_item_operation = 'DeepArchiveObjectOverhead' or line_item_operation = 'DeepArchiveS3ObjectOverhead')) THEN 'Storage GDA-Overhead'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'DeepArchiveRestoreObject') THEN 'Storage GDA-Restored'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation = 'ReducedRedundancyStorage') THEN 'Storage RRS'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation LIKE 'IntelligentTieringAA%') THEN 'Storage INT-AA'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND (line_item_operation = 'IntAAObjectOverhead' or line_item_operation = 'IntAAS3ObjectOverhead')) THEN 'Storage INT-AA-Overhead'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation LIKE 'IntelligentTieringDAA%') THEN 'Storage INT-DAA'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND (line_item_operation = 'IntDAAObjectOverhead' or line_item_operation = 'IntDAAS3ObjectOverhead')) THEN 'Storage INT-DAA-Overhead'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation LIKE 'IntelligentTieringFA%') THEN 'Storage INT-FA'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation LIKE 'IntelligentTieringIA%') THEN 'Storage INT-IA'
WHEN (line_item_usage_type LIKE '%TimedStorage%' AND line_item_operation LIKE 'IntelligentTieringAIA%') THEN 'Storage INT-AIA'
--Data Transfer
WHEN line_item_usage_type LIKE '%AWS-In-Bytes%' THEN 'Data Transfer Region to Region (In)'
WHEN line_item_usage_type LIKE '%AWS-In-ABytes%'THEN 'Data Transfer Accelerated Region to Region (In)'
WHEN line_item_usage_type LIKE '%AWS-Out-Bytes%' THEN 'Data Transfer Region to Region (Out)'
WHEN line_item_usage_type LIKE '%AWS-Out-ABytes%' THEN 'Data Transfer Accelerated Region to Region (Out)'
WHEN line_item_usage_type LIKE '%CloudFront-In-Bytes%' THEN 'Data Transfer CloudFront (In)'
WHEN line_item_usage_type LIKE '%CloudFront-Out-Bytes%' THEN 'Data Transfer CloudFront (Out)'
WHEN line_item_usage_type LIKE '%DataTransfer-Regional-Bytes%' THEN 'Data Transfer Inter AZ'
WHEN line_item_usage_type LIKE '%DataTransfer-In-Bytes%' THEN 'Data Transfer Internet (In)'
WHEN line_item_usage_type LIKE '%DataTransfer-Out-Bytes%' THEN 'Data Transfer Internet (Out)'
WHEN line_item_usage_type LIKE '%DataTransfer-In-ABytes%' THEN 'Data Transfer Accelerated Internet (In)'
WHEN line_item_usage_type LIKE '%DataTransfer-Out-ABytes%' THEN 'Data Transfer Accelerated Internet (Out)'
WHEN line_item_usage_type LIKE '%S3RTC-In-Bytes%' THEN 'Data Transfer Replication Time Control (In)'
WHEN line_item_usage_type LIKE '%S3RTC-Out-Bytes%' THEN 'Data Transfer Replication Time Control (Out)'
--S3 Fees & Misc
WHEN line_item_usage_type LIKE '%Monitoring-Automation-INT' THEN 'S3 INT Monitoring Fee'
WHEN line_item_usage_type LIKE '%StorageAnalytics%' THEN 'S3 Storage Analytics'
WHEN line_item_usage_type LIKE '%BatchOperations-Jobs%' THEN 'S3 Batch Operations-Jobs'
WHEN line_item_usage_type LIKE '%BatchOperations-Objects%' THEN 'S3 Batch Operations-Objects'
WHEN line_item_usage_type LIKE '%TagStorage%' THEN 'S3 Tag Storage'
WHEN (line_item_usage_type LIKE '%Select-Returned%' OR line_item_usage_type LIKE '%Select-Scanned%') THEN 'S3 Select'
WHEN line_item_usage_type LIKE '%Inventory%' THEN 'S3 Inventory'
WHEN line_item_operation LIKE '%StorageLens%' THEN 'Storage Lens'
ELSE 'Other ' || line_item_usage_type
END as case_line_item_usage_type,
SUM(CAST(line_item_usage_amount AS double)) AS sum_line_item_usage_amount,
SUM(CAST(line_item_unblended_cost AS decimal(16,8))) AS sum_line_item_unblended_cost
FROM
customer_all
WHERE
year = '2024' and (month between '1' and '6')
AND line_item_product_code = 'AmazonS3'
AND line_item_line_item_type in ('DiscountedUsage','Usage', 'SavingsPlanCoveredUsage')
AND product_product_family != 'Data Transfer'
GROUP BY
bill_payer_account_id,
line_item_usage_account_id,
DATE_FORMAT((line_item_usage_start_date),'%Y-%m-%d'),
line_item_resource_id,
line_item_operation,
6 --refers to case_line_item_usage_type
ORDER BY
sum_line_item_unblended_cost DESC
コストと使用状況の可視化
最後にQuicksightでCUDOS ダッシュボードを展開しました。別のセッションで実施した方法と同様でCloudShellでcid-cmd
コマンドを実行する手順で作成をしました。
手順はこちらのブログをご参考ください。
作成するとこのようなダッシュボードを確認できます。
以上でコスト最適化の分野は完了となりました。
実施した感想
コスト最適化のために実施しないといけない一連の設定を改めて学べました。特にAWS Budgetの設定でどの閾値でアラートをさせるかは普段疑問に思っていたので、講師の方から直接コメントをもらえて嬉しかったです。また継続的にコスト最適化に取り組むためにも、エンジニアだけでなく、エグゼクティブ層などの組織全体が確認できるダッシュボード運用は必須だなと感じました。
おわりに
今回のセッションで、AWS環境をベストプラクティスに近づけるための「セキュリティ」「コスト最適化」のテクニックを身につけることができました!
得意分野だと思っていた「セキュリティ」「コスト最適化」に関して、まだまだ知らないことがたくさんあるなと思いました。今後も継続的な学習と適用を通じて、ベストプラクティスをさらに学んでいきたいと思います。
最後までお読みいただきありがとうございました!
どなたかのお役に立てれば幸いです。
以上、おつまみ(@AWS11077)でした!